﻿using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace AttributeDoem
{
    /// <summary>
    /// 验证实体
    /// </summary>
    public static class EntityVerify
    {
        /// <summary>
        /// 验证方法
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <returns></returns>
        public static bool GetEntityVerifyInfo<T>(this T model) where T : class, new()//限制这个拓展方法只能使用在可以实例化的类上
        {
            //获取实体模型
            Type type = model.GetType();
            //获取实体的所有属性
            foreach (PropertyInfo propertyInfo in type.GetProperties())
            {
                //遍历属性，判断属性是否存在BaseVerifyAttribute特性，true会去查看继承链是否存在
                //这个之所以使用Base特性就是抽象出验证特性共同的东西，所有验证都可以调用这个方法生效
                if (propertyInfo.IsDefined(typeof(BaseVerifyAttribute), true))
                {
                    //然后获取属性上面的特性（注意一个属性上面可能会出现多个验证特性，所以这里我们需要获取一个数组）
                    object[] atttribute = propertyInfo.GetCustomAttributes(typeof(BaseVerifyAttribute), true);
                    //进行遍历
                    foreach (BaseVerifyAttribute item in atttribute)
                    {
                        //调用验证方法，传入属性的值
                        if (!item.GetVerifyInfo(propertyInfo.GetValue(model)))
                        {
                            //失败返回
                            return false;
                        }
                    }
                }
            }
            return true;
        }

    }
}
